@@ -15,10 +15,11 @@ from paginator import pagination  | 
            ||
| 15 | 15 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 16 | 16 | 
                 | 
            
| 17 | 17 | 
                from account.models import UserInfo  | 
            
| 18 | 
                +from api.encrypt_views import get_ciphertext  | 
            |
| 18 | 19 | 
                from coupon.models import CouponInfo, UserCouponInfo  | 
            
| 19 | 20 | 
                from integral.models import SaleclerkSubmitLogInfo  | 
            
| 20 | 21 | 
                from logs.models import ComplementCodeLogInfo, MchInfoEncryptLogInfo  | 
            
| 21 | 
                -from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo  | 
            |
| 22 | 
                +from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo  | 
            |
| 22 | 23 | 
                from member.models import GoodsInfo, GoodsOrderInfo, MemberActivityGroupShareInfo, MemberActivityInfo  | 
            
| 23 | 24 | 
                from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo  | 
            
| 24 | 25 | 
                from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, ProductBrandStatusCode,  | 
            
                @@ -1448,9 +1449,37 @@ def complement_code_audit(request):  | 
            ||
| 1448 | 1449 | 
                log.audit_status = audit_status  | 
            
| 1449 | 1450 | 
                log.save()  | 
            
| 1450 | 1451 | 
                 | 
            
| 1451 | 
                - # if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS:  | 
            |
| 1452 | 
                - # # TODO: Send template_message  | 
            |
| 1453 | 
                - # pass  | 
            |
| 1452 | 
                + # 如果"审核通过"  | 
            |
| 1453 | 
                + if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS:  | 
            |
| 1454 | 
                + # # TODO: Send template_message  | 
            |
| 1455 | 
                + try:  | 
            |
| 1456 | 
                + brand = BrandInfo.objects.get(brand_id=brand_id)  | 
            |
| 1457 | 
                + except BrandInfo.DoesNotExist:  | 
            |
| 1458 | 
                + brand = None  | 
            |
| 1459 | 
                +  | 
            |
| 1460 | 
                + try:  | 
            |
| 1461 | 
                + model = ModelInfo.objects.get(model_id=log.model_id)  | 
            |
| 1462 | 
                + except ModelInfo.DoesNotExist:  | 
            |
| 1463 | 
                + model = None  | 
            |
| 1464 | 
                +  | 
            |
| 1465 | 
                + # brand_id#model_id#distributor_id#sn#time  | 
            |
| 1466 | 
                + # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224  | 
            |
| 1467 | 
                +        # brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
               | 
            |
| 1468 | 
                +        plaintext = '{}#{}#{}#{}#{}'.format(
               | 
            |
| 1469 | 
                + brand.pk if brand else 0,  | 
            |
| 1470 | 
                + model.pk if model else 0,  | 
            |
| 1471 | 
                + 0,  | 
            |
| 1472 | 
                + log.sn,  | 
            |
| 1473 | 
                + tc.local_string(format='%Y%m%d')[2:],  | 
            |
| 1474 | 
                + )  | 
            |
| 1475 | 
                + ciphertext = get_ciphertext(plaintext, admin_id, True)  | 
            |
| 1476 | 
                +  | 
            |
| 1477 | 
                + log.ciphertext = ciphertext  | 
            |
| 1478 | 
                + log.save()  | 
            |
| 1479 | 
                +  | 
            |
| 1480 | 
                +        return response(data={
               | 
            |
| 1481 | 
                + 'ciphertext': ciphertext,  | 
            |
| 1482 | 
                + })  | 
            |
| 1454 | 1483 | 
                 | 
            
| 1455 | 1484 | 
                return response()  | 
            
| 1456 | 1485 | 
                 | 
            
                @@ -35,12 +35,7 @@ CIPHER_PREFIX = {
               | 
            ||
| 35 | 35 | 
                }  | 
            
| 36 | 36 | 
                 | 
            
| 37 | 37 | 
                 | 
            
| 38 | 
                -@logit(res=True)  | 
            |
| 39 | 
                -def encrypt(request):  | 
            |
| 40 | 
                -    plaintext = request.POST.get('plaintext', '')
               | 
            |
| 41 | 
                -    optor_id = request.POST.get('optor_id', '')
               | 
            |
| 42 | 
                -    marketcode = request.POST.get('marketcode', '')
               | 
            |
| 43 | 
                -  | 
            |
| 38 | 
                +def get_ciphertext(plaintext, optor_id, marketcode):  | 
            |
| 44 | 39 | 
                # brand_id#model_id#distributor_id#sn#time  | 
            
| 45 | 40 | 
                # AAAA#AAAAAA#AAAAA#AAAAAAAAAAAAAA#180224  | 
            
| 46 | 41 | 
                     brand_pk, model_pk, distributor_pk, sn, time = plaintext.split('#')
               | 
            
                @@ -53,7 +48,7 @@ def encrypt(request):  | 
            ||
| 53 | 48 | 
                marketcode = MarketCodeInfo.objects.select_for_update().filter(has_used=False).first()  | 
            
| 54 | 49 | 
                 | 
            
| 55 | 50 | 
                if not marketcode:  | 
            
| 56 | 
                - return response(MarketCodeStatusCode.MARKET_CODE_NOT_FOUND)  | 
            |
| 51 | 
                + return ''  | 
            |
| 57 | 52 | 
                 | 
            
| 58 | 53 | 
                marketcode.has_used = True  | 
            
| 59 | 54 | 
                marketcode.save()  | 
            
                @@ -68,9 +63,7 @@ def encrypt(request):  | 
            ||
| 68 | 63 | 
                mieli.operator_id = optor_id  | 
            
| 69 | 64 | 
                mieli.save()  | 
            
| 70 | 65 | 
                 | 
            
| 71 | 
                -        return response(200, data={
               | 
            |
| 72 | 
                - 'ciphertext': mieli.code_url,  | 
            |
| 73 | 
                - })  | 
            |
| 66 | 
                + return mieli.code_url  | 
            |
| 74 | 67 | 
                 | 
            
| 75 | 68 | 
                if created_at:  | 
            
| 76 | 69 | 
                alg = random.choice(CIPHER_ALGORITHM)  | 
            
                @@ -93,12 +86,21 @@ def encrypt(request):  | 
            ||
| 93 | 86 | 
                mieli.operator_id = optor_id  | 
            
| 94 | 87 | 
                mieli.save()  | 
            
| 95 | 88 | 
                 | 
            
| 89 | 
                +    return u'{prefix}+{cipherlen}+{ciphertext}'.format(
               | 
            |
| 90 | 
                + prefix=CIPHER_PREFIX.get(mieli.alg, ''),  | 
            |
| 91 | 
                + cipherlen=len(mieli.ciphertext),  | 
            |
| 92 | 
                + ciphertext=mieli.ciphertext,  | 
            |
| 93 | 
                + )  | 
            |
| 94 | 
                +  | 
            |
| 95 | 
                +  | 
            |
| 96 | 
                +@logit(res=True)  | 
            |
| 97 | 
                +def encrypt(request):  | 
            |
| 98 | 
                +    plaintext = request.POST.get('plaintext', '')
               | 
            |
| 99 | 
                +    optor_id = request.POST.get('optor_id', '')
               | 
            |
| 100 | 
                +    marketcode = request.POST.get('marketcode', '')
               | 
            |
| 101 | 
                +  | 
            |
| 96 | 102 | 
                     return response(200, data={
               | 
            
| 97 | 
                -        'ciphertext': u'{prefix}+{cipherlen}+{ciphertext}'.format(
               | 
            |
| 98 | 
                - prefix=CIPHER_PREFIX.get(mieli.alg, ''),  | 
            |
| 99 | 
                - cipherlen=len(mieli.ciphertext),  | 
            |
| 100 | 
                - ciphertext=mieli.ciphertext,  | 
            |
| 101 | 
                - ),  | 
            |
| 103 | 
                + 'ciphertext': get_ciphertext(plaintext, optor_id, marketcode),  | 
            |
| 102 | 104 | 
                })  | 
            
| 103 | 105 | 
                 | 
            
| 104 | 106 | 
                 | 
            
                @@ -29,8 +29,8 @@ class MchSearchModelAndCameraLogInfoAdmin(admin.ModelAdmin):  | 
            ||
| 29 | 29 | 
                 | 
            
| 30 | 30 | 
                 | 
            
| 31 | 31 | 
                class ComplementCodeLogInfoAdmin(admin.ModelAdmin):  | 
            
| 32 | 
                -    list_display = ('user_id', 'log_id', 'name', 'phone', 'model_id', 'model_name', 'sn', 'shot_image', 'invoice_image', 'audit_status', 'status', 'created_at', 'updated_at')
               | 
            |
| 33 | 
                -    list_filter = ('model_id', 'status')
               | 
            |
| 32 | 
                +    list_display = ('user_id', 'log_id', 'name', 'phone', 'model_id', 'model_name', 'sn', 'shot_image', 'invoice_image', 'audit_status', 'ciphertext', 'is_contacted', 'status', 'created_at', 'updated_at')
               | 
            |
| 33 | 
                +    list_filter = ('model_id', 'audit_status', 'is_contacted', 'status')
               | 
            |
| 34 | 34 | 
                 | 
            
| 35 | 35 | 
                 | 
            
| 36 | 36 | 
                admin.site.register(MchInfoDecryptLogInfo, MchInfoDecryptLogInfoAdmin)  | 
            
                @@ -0,0 +1,25 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.29 on 2021-01-07 06:38  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('logs', '0015_complementcodeloginfo_is_contacted'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='complementcodeloginfo',  | 
            |
| 17 | 
                + name='ciphertext',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u5f85\u89e3\u5bc6\u5b57\u7b26\u4e32', max_length=64, null=True, verbose_name='ciphertext'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AlterField(  | 
            |
| 21 | 
                + model_name='complementcodeloginfo',  | 
            |
| 22 | 
                + name='audit_status',  | 
            |
| 23 | 
                + field=models.IntegerField(choices=[(0, '\u5f85\u5ba1\u6838'), (1, '\u5ba1\u6838\u901a\u8fc7'), (-1, '\u5ba1\u6838\u4e0d\u901a\u8fc7')], default=0, help_text='\u5ba1\u6838\u72b6\u6001', verbose_name='audit_status'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + ]  | 
            
                @@ -143,6 +143,8 @@ class ComplementCodeLogInfo(BaseModelMixin):  | 
            ||
| 143 | 143 | 
                 | 
            
| 144 | 144 | 
                audit_status = models.IntegerField(_(u'audit_status'), choices=AUDIT_STATUS_TUPLE, default=AUDIT_TODO, help_text=u'审核状态')  | 
            
| 145 | 145 | 
                 | 
            
| 146 | 
                + ciphertext = models.CharField(_(u'ciphertext'), max_length=64, blank=True, null=True, help_text=u'待解密字符串', db_index=True)  | 
            |
| 147 | 
                +  | 
            |
| 146 | 148 | 
                is_contacted = models.BooleanField(_(u'is_contacted'), default=False, help_text=u'是否已联系用户')  | 
            
| 147 | 149 | 
                 | 
            
| 148 | 150 | 
                class Meta:  |